package net.tngou.iask.action.api;


import java.lang.reflect.InvocationTargetException;
import java.util.HashMap;
import java.util.Map;

import org.apache.commons.beanutils.PropertyUtils;
import org.apache.commons.lang3.math.NumberUtils;

import net.tngou.iask.action.BaseAction;
import net.tngou.iask.enums.LevelEnum;
import net.tngou.iask.pojo.Address;
import net.tngou.iask.pojo.Linkman;
import net.tngou.iask.pojo.Main;
import net.tngou.iask.pojo.POJO;
import net.tngou.iask.pojo.Patient;
import net.tngou.iask.pojo.Patient_main;
import net.tngou.iask.pojo.Patient_user;
import net.tngou.iask.service.PatientService;
import net.tngou.iask.util.IDUtil;
import net.tngou.iask.util.IDUtil.No;
import net.tngou.iask.util.StringUtil;
import net.tngou.iask.util.ValidateTools;

/**
 * 病人操作
 * @author tngou@tngou.net
 *
 */
public class PatientApi extends BaseAction {

	
	/**
	 * 添加患者
	 */
	public void add() {
		if(user==null){
			run_nologin();return;
		}
		Patient bean =getAsk(Patient.class);
		String phone=request.getParameter("phone");
		int relation=0;
		if(user.getRole()==0&&request.getParameter("relation")!=null&&NumberUtils.isNumber(request.getParameter("relation")))
			relation=Integer.parseInt(request.getParameter("relation"));		
		if(isEmpty(bean.getNo(),bean.getName()))
		{
			run_false("请求的参数不正确！");return;	
		}
		No no = IDUtil.GetNo(bean.getNo());
		if(no==null)
		{
			run_false("身份证号码不正确！");return;
		}
		Patient patient = new Patient().get(new HashMap<String,Object>(){{
			put("no", bean.getNo());
		}});
		if(patient!=null)
		{
			if(user.getMain()==0)
			{
				run_false("患者信息已存在！");return;
			}
			if(!patient.getName().equals(bean.getName()))
			{
				run_false("患者信息错误！");return;
			}
			Patient_main pm = new  Patient_main().get("patient="+patient.getId()+" AND main="+user.getMain());
			if(pm==null)
			 {
				 pm= new Patient_main();
				 pm.setMain(user.getMain());
				 pm.setPatient(patient.getId());
				 pm.save();
				 run_success("添加成功!");
				 if(user.getRole()>0&&ValidateTools.Mobile(phone))
					{
						 Linkman linkman = new Linkman();
						 linkman.setName(bean.getName());
						 linkman.setTel(phone);
						 linkman.setPatient(patient.getId());
						 linkman.setRelation(0);
						 linkman.setIsuse(1);
						 linkman.setIsdefault(1);
						 linkman.save();
					}
				 return;
				
			 }else
			 {
				 run_false("患者信息已存在！");return;
			 }
			
			
		}
		PatientService service = new PatientService();
		
		long id = service.save(bean, no, user,phone,relation);		
		
		if(id>0)
		{
			saveLog(LevelEnum.common, "添加患者(id:"+id+"-"+bean.getName()+")");
			run_success("添加成功！");return;
		}else
		{
			run_false("添加失败！");return;
		}
		
	}
	/**
	 * 添加病人信息
	 * 
	 */
	public void update() {
		if(user==null){
			run_nologin();return;
		}
		Patient bean =getAsk(Patient.class);
		if(isEmpty(bean.getNo(),bean.getName()))
		{
			run_false("请求的参数不正确！");return;	
		}
		No no = IDUtil.GetNo(bean.getNo());
		if(no==null)
		{
			run_false("身份证号码不正确！");return;
		}
		Patient patient = new Patient().get(new HashMap<String,Object>(){{
			put("no", bean.getNo());
		}});
		long id=0;
		if(patient!=null)
		{
			if(!bean.getName().equals(patient.getName()))//新的名称与原始名称的不一样
			{
				run_false("患者信息有误，添加失败！");return;
			}else//
			{
				//判断更新的数据
				try {
					Map<String, Object> map = PropertyUtils.describe(bean);
					map.remove("id");
					map.remove("no");
					map.remove("name");
					map.remove("class");
					Object[] keys = map.keySet().toArray();	
				    for (Object key : keys) {
				    	if(map.get(key)==null){
					    	map.remove(key);
					    }else{
					    	if(NumberUtils.isNumber(map.get(key).toString())
					    			&&Long.parseLong(map.get(key).toString())==0)
					    	{
					    		map.remove(key);
					    	}
					    }
					}
				   id = bean.update(map,patient.getId());
					
				} catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {
					e.printStackTrace();
					run_false("患者更新失败！");return;
				}
				
			}
		}else
		{
			if(bean.getBirthday()==null)bean.setBirthday(no.getBirthday());
			if(bean.getGender()==0)bean.setGender(no.getGender());
			if(bean.getBirthcity()==0)
			{
				Address address = new Address().get(Long.parseLong(no.getLand()));
				if(address!=null){
					bean.setBirthcity(address.getId());
					if(StringUtil.isEmpty(bean.getBirthaddress()))
					{
						int type=0;
						String adds="";
						do {						
							adds=address.getName()+" "+adds;
							address = address.get(address.getParent_id());
							if(address!=null)						
							type=address.getType();
							else type=0;
						} while (type>1);
						bean.setBirthaddress(adds);//设置出生地
					}
				}
			}
			id = bean.save();
		}
		if(id>0)
		{
			if(user.getRole()>0&&user.getMain()>0)//系统管理
			{
				 Patient_main pm = new  Patient_main().get("patient="+id+" AND main="+user.getMain());
				 if(pm==null)
				 {
					 pm= new Patient_main();
					 pm.setMain(user.getMain());
					 pm.setPatient(id);
					 pm.save();
				 }
			}else if(user.getRole()==0)//普通用户
			{
				Patient_user pu=new Patient_user().get("patient="+id+" AND user="+user.getId());
				if(pu==null)
				{
					pu=new Patient_user();
					pu.setPatient(id);
					pu.setUser(user.getId());
					pu.setRelation(0);
					String relation=request.getParameter("relation");
					if(relation!=null&&NumberUtils.isNumber(relation))
						pu.setRelation(Integer.parseInt(relation));
					pu.save();
				}
			}
			run_success("更新成功！");return;
		}else
		{
			run_false("患者更新失败！");return;
		}
		
	}
	
	/**
	 * 通过身份证取得信息
	 */
	
	public void getno() {
		if(user==null){
			run_nologin();return;
		}
		String no = request.getParameter("no");
		if(isEmpty(no))
		{
			run_false("请求的参数不正确！");return;	
		}
		@SuppressWarnings("serial")
		Patient patient = new Patient().get(new HashMap<String,Object>(){{
			put("no", no);
		}});
		if(patient!=null)
		{
			//进行姓名处理
			char[] chars = patient.getName().toCharArray();
			String name=chars[0]+"*"; 
			if(chars.length>2)name=chars[0]+"*"+chars[chars.length-1];
			patient.setName(name);
			printJson(toJsonP(patient));
		}else
		{
			run_false("不存在相关的患者信息！");return;
		}
		
	}
	
	/**
	 * 显示患者详情
	 */
	public void show() {
		if(user==null){
			run_nologin();return;
		}
		if(ask.getId()==0)
		{
			run_false("请求的参数不正确！");return;	
		}
		Patient patient= new Patient().get(ask.getId());
		if(patient!=null)
		{
			//进行姓名处理
			patient.setNo(IDUtil.Simple(patient.getNo()));//省份证好做处理
			printJson(toJsonP(patient));
		}else
		{
			run_false("不存在相关的患者信息！");return;
		}
	}
	
	/**
	 * 用户绑定患者列表
	 */
	public void bindlist() {
		
	}
	
	/**
	 * 绑定患者
	 */
	public void bind() {
		if(user==null){
			run_nologin();return;
		}
		Patient bean =getAsk(Patient.class);
		if(isEmpty(bean.getNo(),bean.getName()))
		{
			run_false("请求的参数不正确！");return;	
		}
		if(user.getRole()!=0)
		{
			run_false("不能绑定账号！");return;
		}
		Patient patient = new Patient().get(new HashMap<String,Object>(){{
			put("no", bean.getNo());
		}});
		if(patient==null)
		{
			run_false("没有绑定账号！");return;
		}
		if(patient.getName().equals(bean.getName()))
		{
			Patient_user pu=new Patient_user().get("patient="+patient.getId()+" AND user="+user.getId());
			if(pu==null)
			{
				pu=new Patient_user();
				pu.setPatient(patient.getId());
				pu.setUser(user.getId());
				pu.setRelation(0);
				String relation=request.getParameter("relation");
				if(relation!=null&&NumberUtils.isNumber(relation))
					pu.setRelation(Integer.parseInt(relation));
				pu.save();
				run_success("绑定成功！");
			}else
			{
				run_false("已经绑定账号！");return;
			}
		}else{
			run_false("关联账号信息错误，省份证与名字不对！");return;
		}
	}
	
	/**
	 * 取消绑定
	 */
	public void unbind() {
		if(user==null){
			run_nologin();return;
		}
		if(user.getRole()!=0)
		{
			run_false("不能取消绑定账号！");return;
		}
		boolean b = new Patient_user().delete("patient="+ask.getId()+" AND user="+user.getId());
		if(b)run_success("取消绑定成功！");
		else run_false("取消绑定失败！");		
	}
	
	/**
	 * 实体管理病人 
	 */
	public void relationlist() {
		
	}
	/**
	 * 实体管理 病人
	 */
	public void relation() {
		if(user==null){
			run_nologin();return;
		}
		Patient bean =getAsk(Patient.class);
		if(isEmpty(bean.getNo(),bean.getName()))
		{
			run_false("请求的参数不正确！");return;	
		}
		if(user.getMain()==0)
		{
			run_false("不能关联账号！");return;
		}
		Patient patient = new Patient().get(new HashMap<String,Object>(){{
			put("no", bean.getNo());
		}});
		if(patient==null)
		{
			run_false("没有关联账号！");return;
		}
		if(patient.getName().equals(bean.getName()))
		{
			Patient_main pm=new Patient_main().get("patient="+patient.getId()+" AND main="+user.getMain());
			if(pm==null)
			{
				pm=new Patient_main();
				pm.setPatient(patient.getId());
				pm.setMain(user.getMain());		
				pm.save();
				run_success("关联成功！");
			}else
			{
				run_false("已经关联账号！");return;
			}
		}else{
			run_false("关联账号信息错误，省份证与名字不对！");return;
		}
	}
	
	/**
	 * 取消管理
	 */
	public void unrelation() {
		if(user==null){
			run_nologin();return;
		}
		if(user.getMain()==0||user.getRole()!=3&&user.getRole()!=4)//只有管理者才有删除权限
		{
			run_false("不能取消绑定账号！");return;
		}
		boolean b = new Patient_main().delete("patient="+ask.getId()+" AND main="+user.getMain());
		if(b)run_success("取消管理成功！");
		else run_false("取消管理失败！");
	}
	
	/**
	 * 添加患者联系人
	 */
	public void linkmanadd() {
		if(user==null){
			run_nologin();return;
		}
		Linkman bean = getAsk(Linkman.class);
		if(isEmpty(bean.getName(),bean.getTel())||bean.getPatient()==0)
		{
			run_false("请求的参数不正确！");return;
		}
		Patient patient=new Patient().get(bean.getPatient());
		if(patient==null)
		{
			run_false("患者信息不存在！");return;
		}
		long id = bean.save();
		if(id>0)
		{
			saveLog(LevelEnum.common, "添加联系人(id:"+bean.getId()+"-"+bean.getName()+")");
			run_success("添加成功！");
		}else
		{
			run_false("添加失败！");return;
		}
	}
	/**
	 * 编辑患者的联系人
	 */
	public void linkmanupdate() {
		if(user==null){
			run_nologin();return;
		}
		Linkman bean = getAsk(Linkman.class);
		if(bean.getId()==0)
		{
			run_false("请求的参数不正确！");return;
		}
		Linkman linkman = new Linkman().get(bean.getId());
		if(linkman==null)
		{
			run_false("请求的数据不正确！");return;
		}
		//权限控制
		if(user.getRole()==0)//会员
		{
			new Patient_user().get("patient="+linkman.getPatient()+" AND user="+user.getId());
		}else{//管理者
			if(user.getMain()!=0)
			{
				POJO pojo = new Patient_main().get("patient="+linkman.getPatient()+" AND main="+user.getMain());
				if(pojo==null)
				{
					run_false("没有修改权限！");return;
				}
			}	
		}
		
		if(StringUtil.isEmpty(bean.getName()))linkman.setName(bean.getName());
		if(StringUtil.isEmpty(bean.getTel()))linkman.setTel(bean.getTel());
		String isuse=request.getParameter("isuse");// 	是否有效 0（无效）、1（有效） 
		String isdefault=request.getParameter("isdefault");// 	是否默认 0（否）、1（是）
		String relation=request.getParameter("relation");//	患者用户关系：0（自己）、1（夫妻）、2（子女）、3（父母）、4（亲人）、5（朋友）
		if(StringUtil.isNotEmpty(isuse)&&NumberUtils.isNumber(isuse))linkman.setIsuse(Integer.parseInt(isuse));
		if(StringUtil.isNotEmpty(isdefault)&&NumberUtils.isNumber(isdefault))linkman.setIsdefault(Integer.parseInt(isdefault));
		if(StringUtil.isNotEmpty(relation)&&NumberUtils.isNumber(relation))linkman.setRelation(Integer.parseInt(relation));
		long id = linkman.update();
		if(id>0)
		{
			saveLog(LevelEnum.common, "编辑联系人(id:"+linkman.getId()+"-"+linkman.getName()+")");
			run_success("添加成功！");
		}else
		{
			run_false("添加失败！");return;
		}
	}
	
	/**
	 * 删除病人的联系人
	 */
	public void linkmandelete(){
		if(user==null){
			run_nologin();return;
		}
		Linkman bean = getAsk(Linkman.class);
		if(bean.getId()==0)
		{
			run_false("请求的参数不正确！");return;
		}
		Linkman linkman = new Linkman().get(bean.getId());
		if(linkman==null)
		{
			run_false("请求的数据不正确！");return;
		}
		//权限控制
		if(user.getRole()==0)//会员
		{
			new Patient_user().get("patient="+linkman.getPatient()+" AND user="+user.getId());
		}else{//管理者
			if(user.getMain()!=0)
			{
				POJO pojo = new Patient_main().get("patient="+linkman.getPatient()+" AND main="+user.getMain());
				if(pojo==null)
				{
					run_false("没有修改权限！");return;
				}
			}	
		}
		boolean b = linkman.delete();
		if(b){
			saveLog(LevelEnum.common, "删除联系人(id:"+linkman.getId()+"-"+linkman.getName()+")");
			run_success("删除成功！");
		}else
		{
			run_false("删除失败！");return;
		}
	}
		
}
